Add Java Durable Task SDK sample for Work Item Filtering#276
Add Java Durable Task SDK sample for Work Item Filtering#276bachuv wants to merge 9 commits intoAzure-Samples:mainfrom
Conversation
|
Tested this PR locally end-to-end against the DTS emulator (built All functional checklist items pass: orchestrations complete 3/3 across batches, each worker only processes its registered work item types (Orchestrator: 30 dispatches / 0 activities; Validator: 36 ValidateOrder / 0 ShipOrder / 0 orchestrations; Shipper: 24 ShipOrder / 0 ValidateOrder / 0 orchestrations), the strict-routing experiment works as documented (stop Shipper → ShipOrder backlogs, restart → backlog drains immediately), and Found four issues worth addressing before merge: 1.
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds a standalone Java scenario sample demonstrating Durable Task Scheduler work item filtering (useWorkItemFilters()), including local/Docker execution and Azure Container Apps deployment assets.
Changes:
- Introduces a new Gradle multi-project Java scenario sample (client + 3 dedicated workers) that uses DTS work item filters for strict routing.
- Adds Dockerfiles/logging config and shared connection-string helper for running the sample locally or in containers.
- Adds Bicep +
azure.yamlto deploy the sample to Azure Container Apps with KEDA scaling, and updates CI to build the new sample.
Reviewed changes
Copilot reviewed 40 out of 41 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/README.md | Documents the scenario, architecture, run steps, and Azure deployment. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/azure.yaml | Defines 4 containerapp services for azd up. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/build.gradle | Root Gradle configuration and shared dependencies for all subprojects. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/settings.gradle | Declares the multi-project build structure. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/.gitignore | Ignores Gradle/IDE/build outputs for the sample. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/gradlew | Adds Gradle wrapper script for POSIX. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/gradlew.bat | Adds Gradle wrapper script for Windows. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/gradle/wrapper/gradle-wrapper.properties | Pins Gradle wrapper distribution version. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shared/src/main/java/io/durabletask/samples/ConnectionHelper.java | Provides env-var based connection-string construction for emulator/Azure. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shared/build.gradle | Declares the shared module (currently only a comment). |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/client/src/main/java/io/durabletask/samples/Client.java | Adds client that schedules orchestration batches and waits for completion. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/client/src/main/resources/logback.xml | Adds console logging config for the client. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/client/build.gradle | Configures the client app entry point and shared dependency. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/client/Dockerfile | Builds/runs the client as a container image. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/orchestrator-worker/src/main/java/io/durabletask/samples/OrchestratorWorker.java | Adds orchestration-only worker demonstrating filter-based routing. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/orchestrator-worker/src/main/resources/logback.xml | Adds console logging config for orchestrator worker. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/orchestrator-worker/build.gradle | Configures orchestrator worker app entry point and shared dependency. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/orchestrator-worker/Dockerfile | Builds/runs orchestrator worker as a container image. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/validator-worker/src/main/java/io/durabletask/samples/ValidatorWorker.java | Adds ValidateOrder-only activity worker with auto-generated filters. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/validator-worker/src/main/resources/logback.xml | Adds console logging config for validator worker. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/validator-worker/build.gradle | Configures validator worker app entry point and shared dependency. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/validator-worker/Dockerfile | Builds/runs validator worker as a container image. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shipper-worker/src/main/java/io/durabletask/samples/ShipperWorker.java | Adds ShipOrder-only activity worker with auto-generated filters. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shipper-worker/src/main/resources/logback.xml | Adds console logging config for shipper worker. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shipper-worker/build.gradle | Configures shipper worker app entry point and shared dependency. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/shipper-worker/Dockerfile | Builds/runs shipper worker as a container image. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/main.bicep | Provisions RG, identity, DTS, and 4 Container Apps in ACA. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/main.parameters.json | Parameter file for deployment values via azd. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/abbreviations.json | Resource name abbreviations for consistent naming. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/app/app.bicep | Deploys each service container app with KEDA custom scaler parameters. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/app/dts.bicep | Provisions DTS scheduler + task hub. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/app/user-assigned-identity.bicep | Creates shared user-assigned managed identity. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/host/container-app.bicep | Container App template including identity/registry/KEDA settings. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/host/container-apps.bicep | Provisions ACA environment + ACR. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/host/container-apps-environment.bicep | Creates ACA managed environment (optional VNet integration). |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/host/container-registry.bicep | Creates ACR and optional diagnostics. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/networking/vnet.bicep | Creates VNet + subnets for ACA integration. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/security/role.bicep | Creates role assignments for identity/user access to DTS. |
| samples/scenarios/WorkItemFilteringSplitActivitiesJava/infra/core/security/registry-access.bicep | Assigns ACR Pull role assignment for the managed identity. |
| .github/workflows/build-samples.yml | Updates CI to build additional Java samples including this scenario. |
Comments suppressed due to low confidence (4)
samples/scenarios/WorkItemFilteringSplitActivitiesJava/shared/src/main/java/io/durabletask/samples/ConnectionHelper.java:1
ConnectionHelperis placed in thesharedmodule but is package-private, as isgetConnectionString(). While package access can work across JARs if they share the same package name and classloader, this is fragile and surprising for a shared utility. Making the class and methodpublicwould make the intended cross-module usage explicit and reduce the chance of access issues in different packaging/runtime setups.
samples/scenarios/WorkItemFilteringSplitActivitiesJava/shared/src/main/java/io/durabletask/samples/ConnectionHelper.java:1ConnectionHelperis placed in thesharedmodule but is package-private, as isgetConnectionString(). While package access can work across JARs if they share the same package name and classloader, this is fragile and surprising for a shared utility. Making the class and methodpublicwould make the intended cross-module usage explicit and reduce the chance of access issues in different packaging/runtime setups.
samples/scenarios/WorkItemFilteringSplitActivitiesJava/shared/src/main/java/io/durabletask/samples/ConnectionHelper.java:1- Local-emulator detection is overly strict: it only matches exactly
http://localhost:8080. If a user setsENDPOINTtohttp://127.0.0.1:8080, includes a trailing slash, or uses a different localhost port mapping, the code will incorrectly select Azure authentication. Parsingendpointas a URI and checking for localhost/loopback (and/or allowing a configurable emulator-auth override) would make local runs much more reliable.
samples/scenarios/WorkItemFilteringSplitActivitiesJava/validator-worker/src/main/java/io/durabletask/samples/ValidatorWorker.java:1 - Logging the full connection string can leak sensitive data if
DURABLE_TASK_CONNECTION_STRINGever includes credentials (or if future auth modes add secrets). Consider logging only non-sensitive parts (e.g., endpoint/task hub) or redacting known secret fields before logging.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 40 out of 42 changed files in this pull request and generated 5 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
… with ThresholdBytes
Purpose
Adds a Java port of the Work Item Filtering split activities scenario sample (
samples/scenarios/WorkItemFilteringSplitActivitiesJava), using the standalone Durable Task SDK (not Durable Functions). This demonstrates the newuseWorkItemFilters()API from durabletask-java v1.9.0 to route orchestration and activity work items to dedicated workers.What's included
OrderProcessingOrchestrationValidateOrderactivityShipOrderactivityConnectionHelper— builds DTS connection strings from environment variables (emulator, Managed Identity, DefaultAzure)azure.yamlfor one-commandazd updeployment to Azure Container Apps with KEDA scalingHow it works
Each worker calls
.useWorkItemFilters()on theDurableTaskGrpcWorkerBuilderto auto-generate filters from registered tasks. DTS routes work items only to workers with matching filters — no cross-processing occurs.Tested locally
Verified end-to-end against the DTS emulator (
mcr.microsoft.com/dts/dts-emulator:latest):ValidateOrderactivitiesShipOrderactivitiesRelated
samples/scenarios/WorkItemFilteringSplitActivitiesDoes this introduce a breaking change?
Pull Request Type
What kind of change does this Pull Request introduce?
How to Test
git clone https://github.com/Azure-Samples/Durable-Task-Scheduler.git cd Durable-Task-Scheduler git checkout vabachu/work-item-filters-javacd samples/scenarios/WorkItemFilteringSplitActivitiesJava ./gradlew buildWhat to Check
Verify that the following are valid:
ValidateOrderactivity work itemsShipOrderactivity work itemsShipOrderwork items to remain pending (not routed to other workers)ShipOrderwork items to complete immediatelyOther Information
durabletask-client:1.9.0anddurabletask-azuremanaged:1.9.0from Maven local (not yet published to Maven Central)